package com.xiaofengstu.mcams.dto;

import com.xiaofengstu.mcams.enums.RespStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * The type Basic result vo.
 *
 * @param <T> the type parameter
 * @Author FengZeng
 * @Date 2022 -05-10 18:43
 * @Description TODO
 */
@Getter
@ToString(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public class BasicResultDTO<T> {
  /**
   * 响应状态
   */
  private String status;

  /**
   * 响应编码
   */
  private String msg;

  /**
   * 返回数据
   */
  private T data;

  /**
   * Instantiates a new Basic result vo.
   *
   * @param status the status
   */
  public BasicResultDTO(RespStatusEnum status) {
    this(status, null);
  }

  /**
   * Instantiates a new Basic result vo.
   *
   * @param status the status
   * @param data   the data
   */
  public BasicResultDTO(RespStatusEnum status, T data) {
    this(status, status.getMsg(), data);
  }

  /**
   * Instantiates a new Basic result vo.
   *
   * @param status the status
   * @param msg    the msg
   * @param data   the data
   */
  public BasicResultDTO(RespStatusEnum status, String msg, T data) {
    this.status = status.getCode();
    this.msg = msg;
    this.data = data;
  }

  /**
   * Success basic result vo.
   *
   * @return 默认成功响应 basic result vo
   */
  public static BasicResultDTO<Void> success() {
    return new BasicResultDTO<>(RespStatusEnum.SUCCESS);
  }

  /**
   * 自定义信息的成功响应
   * <p>通常用作插入成功等并显示具体操作通知如: return BasicResultVO.success("发送信息成功")</p>
   *
   * @param <T> the type parameter
   * @param msg 信息
   * @return 自定义信息的成功响应 basic result vo
   */
  public static <T> BasicResultDTO<T> success(String msg) {
    return new BasicResultDTO<>(RespStatusEnum.SUCCESS, msg, null);
  }

  /**
   * 带数据的成功响应
   *
   * @param <T>  the type parameter
   * @param data 数据
   * @return 带数据的成功响应 basic result vo
   */
  public static <T> BasicResultDTO<T> success(T data) {
    return new BasicResultDTO<>(RespStatusEnum.SUCCESS, data);
  }

  /**
   * Fail basic result vo.
   *
   * @param <T> the type parameter
   * @return 默认失败响应 basic result vo
   */
  public static <T> BasicResultDTO<T> fail() {
    return new BasicResultDTO<>(
        RespStatusEnum.FAIL,
        RespStatusEnum.FAIL.getMsg(),
        null
    );
  }

  /**
   * 自定义错误信息的失败响应
   *
   * @param <T> the type parameter
   * @param msg 错误信息
   * @return 自定义错误信息的失败响应 basic result vo
   */
  public static <T> BasicResultDTO<T> fail(String msg) {
    return fail(RespStatusEnum.FAIL, msg);
  }

  /**
   * 自定义状态的失败响应
   *
   * @param <T>    the type parameter
   * @param status 状态
   * @return 自定义状态的失败响应 basic result vo
   */
  public static <T> BasicResultDTO<T> fail(RespStatusEnum status) {
    return fail(status, status.getMsg());
  }

  /**
   * 自定义状态和信息的失败响应
   *
   * @param <T>    the type parameter
   * @param status 状态
   * @param msg    信息
   * @return 自定义状态和信息的失败响应 basic result vo
   */
  public static <T> BasicResultDTO<T> fail(RespStatusEnum status, String msg) {
    return new BasicResultDTO<>(status, msg, null);
  }

}
